package cn.com.jit;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.expr.StringLiteralExpr;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;

public class SqlExtractorFromJava {

    /**
     * 从给定的Java文件中读取字符串，并识别潜在的SQL语句。
     *
     * @param filePath 要解析的Java文件路径
     * @throws IOException 如果文件读取失败或不存在指定路径的文件
     */
    public static void extractSqlStatements(String filePath) throws IOException {
        // 读取指定路径Java文件的全部内容
        String code = new String(Files.readAllBytes(new File(filePath).toPath()));

        CompilationUnit cu;
        try {
            // 使用StaticJavaParser解析Java代码
            cu = StaticJavaParser.parse(code);
        } catch (Exception e) {
            // 捕获解析过程中的异常，并输出错误信息
            System.err.println("Error parsing Java code.");
            return;
        }

        // 查找代码中所有字符串字面量
        List<StringLiteralExpr> stringLiterals = cu.findAll(StringLiteralExpr.class);
        for (StringLiteralExpr literal : stringLiterals) {
            // 获取字符串字面量的值
            String sqlCandidate = literal.asString();
            // 检查字符串是否包含SQL关键字
            if (sqlCandidate.contains("SELECT") || sqlCandidate.contains("INSERT")
                    || sqlCandidate.contains("UPDATE") || sqlCandidate.contains("DELETE")) {
                // 输出潜在的SQL语句
                System.out.println("Potential SQL: " + sqlCandidate);
            }
        }
    }

    public static void main(String[] args) {
        try {
            // 调用extractSqlStatements方法，传入Java文件路径
            extractSqlStatements("src/main/java/cn/com/jit/ReadSourceFiles.java");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
